package com.lg.utils.hutool.io;

import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.Watcher;
import cn.hutool.core.io.watch.watchers.DelayWatcher;
import cn.hutool.core.lang.Console;

import java.nio.file.Path;
import java.nio.file.WatchEvent;


/**
 * 修改 文件
 * 创建删除  文件夹
 * 是文件还是文件夹需要自己判断  阻塞式 事件驱动
 */
public class WatchMonitorTest {
    public static void main(String[] args) {
        //其实我们不必实现Watcher的所有接口方法，Hutool同时提供了SimpleWatcher类，只需重写对应方法即可
        Watcher watcher = new SimpleWatcher() {
            @Override
            public void onCreate(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("创建：{}-> {}", currentPath, obj);
            }

            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("修改：{}-> {}", currentPath, obj);
            }

            @Override
            public void onDelete(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("删除：{}-> {}", currentPath, obj);
            }

//            @Override
//            public void onOverflow(WatchEvent<?> event, Path currentPath) {
//                Object obj = event.context();
//                Console.log("Overflow：{}-> {}", currentPath, obj);
//            }
        };


        /**
         * 在监听目录或文件时，如果这个文件有修改操作，JDK会多次触发modify方法，为了解决这个问题，
         * 我们定义了DelayWatcher，此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发，从而避免以上问题
         */
        WatchMonitor watchMonitor = WatchMonitor.createAll("C:/Users/imlg/Desktop/listen-dir", new DelayWatcher(watcher, 500));


        //设置监听目录的最大深入，目录层级大于制定层级的变更将不被监听，默认只监听当前层级目录
        watchMonitor.setMaxDepth(3);
        //启动监听
        watchMonitor.start();

        /**
         * 上面是作为 子线程  存在的
         */
        System.out.println("end");
    }

}
